package com.linktel.productionLine.dao;

import com.linktel.productionLine.EasyExcel.dailyAttendance.model.WriteDailyAttendance;
import com.linktel.productionLine.entity.dto.dailyAttendance.AttendanceInfoDTO;
import org.apache.ibatis.annotations.Param;

import java.time.LocalDate;
import java.util.List;

/**
 * @author Linktel
 * @description 针对表【daily_attendance(日出勤基础数据)】的数据库操作Mapper
 * @Date 2023-08-30 12:32:32
 */
public interface DailyAttendanceDao {
    /**
     * 根据提交人员id，得到日出勤数据列表
     *
     * @return 日出勤数据列表
     */
    List<AttendanceInfoDTO> listAttendanceInfo(
            @Param("productionLineCode") String productionLineCode,
            @Param("year") Integer year,
            @Param("month") Integer month
    );

    /**
     * 新增日出勤数据
     *
     * @param productionLineCode 产线id
     * @param attendanceDate     出勤日期
     * @param workTime           开班时长
     * @param planningNumber     计划出勤人数人数
     * @param actualNumber       实际出勤人数
     * @param currentUserId      当前登录用户id
     * @return 是否新增成功
     */
    Boolean addAttendanceInfo(@Param("productionLineCode") String productionLineCode,
                              @Param("attendanceDate") LocalDate attendanceDate,
                              @Param("workTime") Integer workTime,
                              @Param("planningNumber") Integer planningNumber,
                              @Param("actualNumber") Integer actualNumber,
                              @Param("targetEfficiency") Double targetEfficiency,
                              @Param("currentUserId") Long currentUserId
    );

    /**
     * 修改日出勤数据
     *
     * @param id             日出勤数据id
     * @param attendanceDate 出勤日期
     * @param workTime       工作时长
     * @param planningNumber 计划出勤人数
     * @param actualNumber   实际出勤人数
     * @param currentUserId  当前登录用户id
     * @return 是否修改成功
     */
    Boolean editAttendanceInfo(@Param("id") Long id,
                               @Param("attendanceDate") LocalDate attendanceDate,
                               @Param("workTime") Integer workTime,
                               @Param("planningNumber") Integer planningNumber,
                               @Param("actualNumber") Integer actualNumber,
                               @Param("targetEfficiency") Double targetEfficiency,
                               @Param("currentUserId") Long currentUserId);

    /**
     * 删除日出请数据
     *
     * @param id            日出勤数据id
     * @param currentUserId 当前登录用户id
     * @return 是否删除成功
     */
    Boolean deleteAttendanceInfo(@Param("id") Long id, @Param("currentUserId") Long currentUserId);

    /**
     * 通过productionLineCode，attendanceDate查询日出勤基础数据
     *
     * @param productionLineCode 产线编码
     * @param attendanceDate     出勤日期
     * @return 日出勤基础数据id
     */
    List<Long> getDailyAttendance(@Param("productionLineCode") String productionLineCode,
                                  @Param("attendanceDate") String attendanceDate,
                                  @Param("currentUserId") Long currentUserId
    );

    /**
     * 批量保存日出勤基础数据
     *
     * @param list 日出勤基础数据列表
     * @param currentUserId 当前登录用户id
     * @return 保存的条数
     */
    Integer batchSave(List<WriteDailyAttendance> list, Long currentUserId);

    /**
     * 根据用户id删除日出勤基础数据
     *
     * @param commitUserId 删除用户id
     * @param currentUserId 当前登录用户id
     */
    void deleteDailyAttendanceByUserId(Long commitUserId, Long currentUserId);

    /**
     * 删除用户和产线的关联关系，同时删除该用户和产线相关日出勤基础数据
     *
     * @param commitUserId 删除用户id
     * @param productionLineCode 产线编码
     * @param currentUserId 当前登录用户id
     */
    void deleteDailyAttendanceByRelation(Long commitUserId, String productionLineCode, Long currentUserId);

    /**
     * 批量删除日出勤基础数据
     *
     * @param list 日出勤基础数据列表
     * @param currentUserId 当前登录用户id
     */
    void batchDelete(List<WriteDailyAttendance> list, Long currentUserId);

    /**
     * 批量替换
     *
     * @param list 日出勤基础数据列表
     * @param currentUserId 当前登录用户id
     */
    void batchReplaceSave(List<WriteDailyAttendance> list, Long currentUserId);
}
